iT邦幫忙

2024 iThome 鐵人賽

DAY 29
0
Modern Web

關於寫react 那二三事系列 第 29

Day29 React-beautiful-dnd (1)

  • 分享至 

  • xImage
  •  

今天來說說react-beautiful-dnd
想推薦它,因為是Atlassian開發的,也許你可能沒聽過這是甚麼公司,
但有些工作經驗的應該多少有聽過或用過 Trello、Jira 或者SourceTree
基於這點理由,就比較不用擔心會有問題很多又沒人維護的問題
當然還有其他選擇react-dnd或react-draggable
也都是相當棒的套件,可以依據自己需求去使用

那就開始吧
先來安裝

npm i react-beautiful-dnd --save

如果有用ts 記得安裝types

npm i @types/react-beautiful-dnd

在來做點基礎的

import React, { useState } from 'react';
import { DragDropContext, Droppable, Draggable, DropResult } from 'react-beautiful-dnd';

type Item = {
  id: string;
  content: string;
};

const initialItems: Item[] = [
  { id: 'item-1', content: 'Item 1' },
  { id: 'item-2', content: 'Item 2' },
  { id: 'item-3', content: 'Item 3' },
  { id: 'item-4', content: 'Item 4' },
];

const DndCompnent: React.FC = () => {
  const [items, setItems] = useState(initialItems);
  const handleOnDragEnd = (result: DropResult) => {
    if (!result.destination) return;

    const newItems = Array.from(items);
    const [movedItem] = newItems.splice(result.source.index, 1);
    newItems.splice(result.destination.index, 0, movedItem);

    setItems(newItems);
  };

  return (
    <DragDropContext onDragEnd={handleOnDragEnd}>
      <Droppable droppableId="droppable-1">
        {(provided) => (
          <div
            {...provided.droppableProps}
            ref={provided.innerRef}
            style={{
              padding: '20px',
              width: '250px',
              minHeight: '200px',
              backgroundColor: '#f0f0f0',
            }}
          >
            {items.map((item, index) => (
              <Draggable key={item.id} draggableId={item.id} index={index}>
                {(provided) => (
                  <div
                    ref={provided.innerRef}
                    {...provided.draggableProps}
                    {...provided.dragHandleProps}
                    style={{
                      ...provided.draggableProps.style,
                      userSelect: 'none',
                      padding: '16px',
                      margin: '0 0 8px 0',
                      backgroundColor: '#fff',
                      border: '1px solid #ccc',
                      borderRadius: '4px',
                    }}
                  >
                    {item.content}
                  </div>
                )}
              </Draggable>
            ))}
            {provided.placeholder}
          </div>
        )}
      </Droppable>
    </DragDropContext>
  );
};

export default DndCompnent;

※要注意如果有用React.StrictMode記得移掉
不然會拖不動喔
例如我在Day5時 設定router的部分中
index.tsx

root.render(
  <React.StrictMode>
    <BrowserRouter>
      <App />
    </BrowserRouter>
  </React.StrictMode>
);

這樣就要魔改

root.render(
  <>
    <BrowserRouter>
      <App />
    </BrowserRouter>
  </>
);

那麼 明天見


上一篇
Day28 Primereact 的後記
下一篇
Day 30 react-beautiful-dnd(2)
系列文
關於寫react 那二三事30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言